home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cpp_libs / nihcl-30.lha / nihcl-3.0 / lib / BitBoard.h < prev    next >
C/C++ Source or Header  |  1990-05-19  |  4KB  |  105 lines

  1. #ifndef    BITBOARD_H
  2. #define    BITBOARD_H
  3.  
  4. /*$Header: /afs/alw.nih.gov/unix/sun4_40c/usr/local/src/nihcl-3.0/share/lib/RCS/BitBoard.h,v 3.0 90/05/20 00:19:11 kgorlen Rel $*/
  5.  
  6. /* BitBoard.h -- Declarations for class BitBoard
  7.  
  8.     THIS SOFTWARE FITS THE DESCRIPTION IN THE U.S. COPYRIGHT ACT OF A
  9.     "UNITED STATES GOVERNMENT WORK".  IT WAS WRITTEN AS A PART OF THE
  10.     AUTHOR'S OFFICIAL DUTIES AS A GOVERNMENT EMPLOYEE.  THIS MEANS IT
  11.     CANNOT BE COPYRIGHTED.  THIS SOFTWARE IS FREELY AVAILABLE TO THE
  12.     PUBLIC FOR USE WITHOUT A COPYRIGHT NOTICE, AND THERE ARE NO
  13.     RESTRICTIONS ON ITS USE, NOW OR SUBSEQUENTLY.
  14.  
  15. Author:
  16.     K. E. Gorlen
  17.     Computer Systems Laboratory, DCRT
  18.     National Institutes of Health
  19.     Bethesda, MD 20892
  20.  
  21. $Log:    BitBoard.h,v $
  22.  * Revision 3.0  90/05/20  00:19:11  kgorlen
  23.  * Release for 1st edition.
  24.  * 
  25. */
  26.  
  27. #include "Object.h"
  28.  
  29. class BitBoard: public VIRTUAL Object {
  30.     DECLARE_MEMBERS(BitBoard);
  31.     union {
  32.         unsigned long m[2];
  33.         unsigned char c[8];
  34.     };
  35. public:
  36.     static void init(const Class&);
  37. protected:        // storer() functions for object I/O
  38.     virtual void storer(OIOofd&) const;
  39.     virtual void storer(OIOout&) const;
  40. public:
  41.     BitBoard() {}
  42.     BitBoard(unsigned i);
  43.     BitBoard(unsigned long i, unsigned long j) { m[0] = i;  m[1] = j; }
  44.     BitBoard operator~() const        { return BitBoard(~m[0], ~m[1]); }
  45.     BitBoard operator-(const BitBoard& n) const    { return BitBoard(m[0]&~n.m[0], m[1]&~n.m[1]); }
  46.     bool operator>(const BitBoard& n) const { return m[0] == (m[0]|n.m[0])
  47.                         && m[0] != n.m[0]
  48.                         && m[1] == (m[1]|n.m[1])
  49.                         && m[1] != n.m[1]; }
  50.     bool operator<(const BitBoard& n) const { return n > *this; }
  51.     bool operator>=(const BitBoard& n) const { return m[0] == (m[0]|n.m[0])
  52.                         && m[1] == (m[1]|n.m[1]); }
  53.     bool operator<=(const BitBoard& n) const { return n >= *this; }
  54.     bool operator==(const BitBoard& n) const { return m[0] == n.m[0] && m[1] == n.m[1]; }
  55.     bool operator!=(const BitBoard& n) const { return m[0] != n.m[0] || m[1] != n.m[1]; }
  56.     BitBoard operator|(const BitBoard& n) const { return BitBoard(m[0]|n.m[0], m[1]|n.m[1]); }
  57.     BitBoard operator&(const BitBoard& n) const { return BitBoard(m[0]&n.m[0], m[1]&n.m[1]); }
  58.     BitBoard operator^(const BitBoard& n) const { return BitBoard(m[0]^n.m[0], m[1]^n.m[1]); }
  59.      void operator-=(const BitBoard& n)    { m[0] &= ~n.m[0]; m[1] &= ~n.m[1]; }
  60.     void operator&=(const BitBoard& n)    { m[0] &= n.m[0]; m[1] &= n.m[1]; }
  61.     void operator^=(const BitBoard& n)    { m[0] ^= n.m[0]; m[1] ^= n.m[1]; }
  62.     void operator|=(const BitBoard& n)    { m[0] |= n.m[0]; m[1] |= n.m[1]; }
  63.     unsigned count() const;
  64.     bool includes(unsigned i) const;
  65.     virtual unsigned capacity() const;
  66.     virtual void deepenShallowCopy();    // {}
  67.     virtual unsigned hash() const;
  68.     virtual bool isEmpty() const;
  69.     virtual bool isEqual(const Object&) const;
  70.     virtual void printOn(ostream& strm =cout) const;
  71.     virtual unsigned size() const;
  72.     virtual const Class* species() const;
  73. private:                // shouldNotImplement()
  74.     virtual int compare(const Object&) const;
  75. };
  76.  
  77. extern BitBoard squareBitBoard[64];
  78. extern BitBoard rankBitBoard[8];
  79. extern BitBoard fileBitBoard[8];
  80. extern unsigned char bit_count[256];
  81.  
  82. inline BitBoard::BitBoard(unsigned i)    { *this = squareBitBoard[i]; }
  83.     
  84. inline unsigned BitBoard::count() const
  85. {
  86.     register unsigned char* p = c;
  87.     register unsigned n = 0;
  88.     n += bitCount(*p++);
  89.     n += bitCount(*p++);
  90.     n += bitCount(*p++);
  91.     n += bitCount(*p++);
  92.     n += bitCount(*p++);
  93.     n += bitCount(*p++);
  94.     n += bitCount(*p++);
  95.     n += bitCount(*p++);
  96.     return n;
  97. }
  98.  
  99. inline bool BitBoard::includes(unsigned i) const
  100. {
  101.     return (m[0] & squareBitBoard[i].m[0]) || (m[1] & squareBitBoard[i].m[1]);
  102. }
  103.  
  104. #endif
  105.